// src/utils/request.js
import axios from 'axios'
import Vue from 'vue'

// 1. 创建 Axios 实例（可配置多个实例应对不同域名）
const service = axios.create({
  baseURL: '/api', // 基地址（从环境变量读取，灵活区分开发/生产环境）
  timeout: 5000, // 请求超时时间（5秒）
  headers: {
    'Content-Type': 'application/json;charset=utf-8' // 默认请求头
  }
})

// 2. 请求拦截器（发送请求前执行，常用于添加 Token）
service.interceptors.request.use(
  (config) => {
    // 示例：从 localStorage 中获取 Token，添加到请求头
    const token = localStorage.getItem('token')
    if (token) {
      config.headers.Authorization = `Bearer ${token}` // Token 格式根据后端要求调整
    }
    return config
  },
  (error) => {
    // 请求错误时的处理（如参数校验失败）
    console.error('请求拦截器错误:', error)
    return Promise.reject(error)
  }
)

// 3. 响应拦截器（收到响应后执行，常用于统一错误处理）
service.interceptors.response.use(
  (response) => {
    // 仅返回响应体中的 data 部分（简化组件中获取数据的逻辑）
    const res = response.data

    // 示例：根据后端状态码判断请求是否成功（需与后端约定状态码）
    if (res.code !== 200) { // 假设 200 为成功状态码
      // 错误提示（使用 Element UI 的 Message 组件，需先安装 Element UI）
      Vue.prototype.$message.error(res.message || '请求失败，请重试')
      
      // 特殊错误处理：如 Token 过期（401），跳转登录页
      if (res.code === 401) {
        localStorage.removeItem('token') // 清除无效 Token
        window.location.href = '/login' // 跳转到登录页
      }
      
      return Promise.reject(new Error(res.message || '请求失败'))
    } else {
      return res // 请求成功，返回数据
    }
  },
  (error) => {
    // 网络错误处理（如断网、超时）
    console.error('响应拦截器错误:', error)
    Vue.prototype.$message.error('网络异常，请检查网络连接')
    return Promise.reject(error)
  }
)

// 4. 导出配置好的 Axios 实例
export default service